1.软硬件说明

1.1Arduino IDE介绍

Arduino IDE(Integrated Development Environment,集成开发环境)是专门为 Arduino 开源硬件平台 设计的一款编程软件,用于编写、编译和上传程序到 Arduino 主控板(如 UNO、MEGA、Nano、ESP32 等)。它是所有 Arduino 项目开发的核心工具。

Arduino IDE官网:https://www.arduino.cc/en/software/

1.2 DFRobot Arduino Uno R3介绍

DFRduino UNO R3是一块基于开放原始代码的Simple i/o平台,并且具有使用类似java,C语言的开发环境。让您可以快速使用Arduino语言与Flash或Processing…等软件,作出互动作品。

商城购买链接:https://www.dfrobot.com.cn/goods-1502.html

硬件连接

准备材料

  • 硬件
    • DFRduino UNO R3 (或类似主板)x 1
    • 扩展板x1
    • Arduino USB数据线 x1
    • HUSKYLENS 2 x 1
    • USB数据线 x1
    • 4pin连接线(或杜邦线)x1

将HukyLens 2 连接到Arduino主板对应的I2C引脚,使用电源线连接Arduino Uno与电脑。**额外供电提示:**Arduino Uno的I2C引脚输出的电压不足以支持HUSKYLENS 2正常工作,当HUSKYLENS 2接在Arduino Uno上时须有额外数据线连接HUSKYLENS 2的Type-C接口与电源,为HUSKYLENS 2进行额外供电。IIC模式接线图可参考下图。

Interface Diagram

HUSKYLENS 2除此默认的通讯方式为I2C模式。如果你的接线方式是UART方式,请在系统设置中找到协议种类手动切换协议种类。

Interface Diagram

3.加载HUSKYLENS 2 库

第一步:首先需要下载HUSKYLENS Arduino Library,

点击此处进行下载:https://gitee.com/dfrobot/DFRobot_HuskylensV2/repository/archive/master.zip

第二步:将下载的文件解压到Arduino IDE所在的“libraries”文件夹的目录下,并将文件名修改为HUSKYLENS2。

Interface Diagram

4.人脸识别代码示例

4.1识别人脸输出数据

在人脸识别功能下,当人脸出现在HUSKYLENS 2 屏幕中时,可以被检测和框出,我们可以获取HUSKYLENS 2 画面中离十字光标最近的人脸的相关数据并在串口打印出来,可以读取的人脸数据有:人脸ID、人脸名称、宽度、高度以及人脸中心点的X坐标位置和Y坐标位置。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		Serial.println((String("人脸的ID") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)))));
		Serial.println((String("人脸名称") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, name)))));
		Serial.println((String("人脸中心点坐标") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, yCenter)))))))));
		Serial.println((String("人脸宽") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, width)))));
		Serial.println((String("人脸高") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, height)))));
		delay(500);
	}
}

**运行结果:**程序上传成功后,HUSKYLENS 2自动切换到人脸识别的功能下如下,对于未学习过的人脸默认输出ID为0。

Interface Diagram

可以对准一张学习过的人脸,,对于已学习过的人脸输出ID与HUSKYLENS 2 屏幕显示的ID保持一致。

Interface Diagram

如何学习人脸详细操作请看:人脸识别功能说明

4.2统计人脸数量输出指定数据

当画面中出现多张人脸时,可以使用以下示例程序统计画面中的人脸数量,获取指定ID的人脸相关数据。

示例程序如下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		Serial.println((String("检测到的人脸数量为:") + String((huskylens.getCachedResultNum(ALGORITHM_FACE_RECOGNITION)))));
	}
	if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1) != NULL))) {
		Serial.println((String("ID1人脸的总数") + String((huskylens.getCachedResultNumByID(ALGORITHM_FACE_RECOGNITION, 1)))));
		Serial.println((String("ID1人脸的名称") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1), Result, name)))));
		Serial.println((String("ID1人脸的中心点坐标") + String((String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1), Result, yCenter)))))))));
		Serial.println((String("ID1人脸的宽") + String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1), Result, width)))));
		Serial.println((String("ID1人脸的高") + String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1), Result, height)))));
	}
	delay(500);
}

**运行结果:**如下图,运行程序,串口打印当前画面中的人脸数量。当ID为1的人脸出现在画面中就打印输出人脸ID1的相关数据。

Interface Diagram

5.物体识别代码示例

5.1识别物体输出相关数据

在物体识别功能下,HUSKYLENS 2 可识别视野内的物体(是80种固定类别物体,详见物体识别使用说明)并将相关数据通过串口打印输出,可以读取的数据有:画面中可识别物体的总数、靠近HUSKYLENS 2 摄像头画面中心的物体ID号、检测到的第一个物体。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OBJECT_RECOGNITION))) {
		Serial.println((String("检测的物体总数:") + String((huskylens.getCachedResultNum(ALGORITHM_OBJECT_RECOGNITION)))));
		Serial.println((String("靠近中心的物体的名称") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_RECOGNITION), Result, name)))));
		Serial.println((String("检测到第一个物体的名称") + String((RET_ITEM_STR(huskylens.getCachedResultByIndex(ALGORITHM_OBJECT_RECOGNITION, 1 - 1), Result, name)))));
	}
	delay(500);
}

** 运行结果:**可输出识别到的物体总数,可按要求输出相应物体ID号。

Interface Diagram

5.2获取画面中指定物体的相关数据

HUSKYLENS 2 识别物体后,可获取画面中指定物体的相关数据。例如,判断某个已学习的物体是否在画面中、指定物体的名称、可获取画面中同类物体的数量,当画面中出现多个同类物体时,可指定获取其中某个物体的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下:

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_RECOGNITION);
	Serial.println((String("检测的物体总数:") + String((huskylens.getCachedResultNum(ALGORITHM_OBJECT_RECOGNITION)))));
	if (((huskylens.getCachedResultByID(ALGORITHM_OBJECT_RECOGNITION, 1) != NULL))) {
		Serial.println((String("ID1物体的数量:") + String((huskylens.getCachedResultNumByID(ALGORITHM_OBJECT_RECOGNITION, 1)))));
		Serial.println((String("ID1物体的名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_OBJECT_RECOGNITION, 1), Result, name)))));
		Serial.println((String("检测到第一个ID为1的物体中心坐标:") + String((String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_OBJECT_RECOGNITION, 1, 1-1), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_OBJECT_RECOGNITION, 1, 1-1), Result, yCenter)))))));
	}
	delay(500);
}

**运行结果:**如图所示,可获取到画面中的物体总数、画面中ID1物体数量、名称,以及检测到的第一个ID1物体的坐标位置。

Interface Diagram

6.物体追踪代码示例

6.1追踪物体输出相关数据

HUSKYLENS 2 检测到可追踪的目标物体时可获取相关追踪数据,并通过串口打印输出。可以读取的数据有:物体的ID、名称、xy坐标、宽度、高度。

示例程序如下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_TRACKING);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_TRACKING);
	if ((huskylens.available(ALGORITHM_OBJECT_TRACKING))) {
		Serial.println((String("追踪的物体ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, ID)))));
		Serial.println((String("追踪的物体名称为:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, name)))));
		Serial.println((String("追踪的物体中心点坐标为:") + String((String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, yCenter)))))));
	}
	delay(500);
}

将HUSKYLENS 2 的摄像头对准画面中的要追踪的物体(追踪物体须先框选目标,详见物体追踪使用说明)。追踪目标框选完成后打开串口监视器,观察输出结果。

**运行结果:**可输出追踪到的物体ID、名称、xy坐标、宽度、高度。物体名称默认为"物体"。

Interface Diagram

7. 颜色识别代码示例

7.1识别颜色输出相关数据

可识别HUSKYLENS 2 视野内的色块,并将相关数据通过串口打印输出,可以读取的数据有:靠近HUSKYLENS 2 摄像头画面中心的色块ID号、检测到的色块总数、第一个检测到的色块ID号等等。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_COLOR_RECOGNITION))) {
		Serial.println((String("靠近中心的色块ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, ID)))));
		Serial.println((String("检测到的色块总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_COLOR_RECOGNITION)))));
		Serial.println((String("第一个检测到的色块ID为:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_COLOR_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}

将HUSKYLENS 2 的十字光标对准画面中的色块进行学习,如何学习颜色详细操作请看:颜色识别功能说明

**运行结果:**可输出检测到的色块总数,无论该色块是否已学习,只要方框框出色块,就会计数。可按要求输出相应色块ID号,其中靠近中心的色块被白框框出,即未学习的色块,因此输出的ID号为0。

Interface Diagram

7.2获取指定颜色的相关数据

HUSKYLENS 2 识别颜色后,可获取画面中指定颜色的相关数据。例如,判断某个已学习的颜色是否在画面中、指定颜色的名称、可获取画面中相同颜色的色块数量,当画面中出现多个相同颜色的色块时,可指定获取其中某个色块的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下:

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_COLOR_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1) != NULL))) {
			Serial.println((String("ID1色块数量为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_COLOR_RECOGNITION, 1)))));
			Serial.println((String("ID1色块名称为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1), Result, name)))));
			Serial.println((String("第一个检测到的ID1色块的中心坐标为") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_COLOR_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_COLOR_RECOGNITION, 1, 1-1), Result, yCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**如图所示,可获取到画面中ID1的色块总数、ID1的色块名称,以及第一个检测到的ID1色块的坐标位置。

Interface Diagram

8.自学习分类代码示例

8.1识别已学习物体输出ID与名称

在自学习分类功能下,HUSKYLENS 2 能学习任何自定义物体,学习后识别出来。自定义分类功能的使用说明详情请见自定义分类

在自学习分类功能下,当已学习某一物体后,HUSKYLENS 2 再次见到该物体就能识别出来,可以使用以下示例程序获取识别的已学习的物体对应ID和名称。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_SELF_LEARNING_CLASSIFICATION);
}
void loop() {
	huskylens.getResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION);
	if ((huskylens.available(ALGORITHM_SELF_LEARNING_CLASSIFICATION))) {
		Serial.println((String("识别到的物体ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION), Result, ID)))));
		Serial.println((String("识别到的物体名称为:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION), Result, name)))));
	}
}

**运行结果:**如下,当已学习过的某一物体出现在画面中时会被框出同时显示其ID与置信度。打开串口监视器观察输出的对应ID和名称。如果未设置该物体的名称,则输出名称默认为:物体。

Interface Diagram

9.实例分割代码示例

9.1实例分割并输出相关数据

在实例分割功能下,HUSKYLENS可以识别中图像中物体的类别并标记出每个物体的轮廓。可以使用程序打印出HUSKYLENS识别出的实例总数墩号靠近中心的实例和指定ID实例的名称、ID、中心点X、Y坐标以及物体的宽度和高度。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_SEGMENT);
}
void loop() {
	huskylens.getResult(ALGORITHM_SEGMENT);
	if ((huskylens.available(ALGORITHM_SEGMENT))) {
		Serial.println((String("识别到的实例总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_SEGMENT)))));
		Serial.println((String("靠近中心的实例中心点坐标为:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_SEGMENT), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_SEGMENT), Result, yCenter)))))))));
		Serial.println((String("识别到的第1个实例ID为") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_SEGMENT, 1 - 1), Result, ID)))));
		Serial.println((String("识别到的第1个实例的坐标") + String((String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_SEGMENT, 1 - 1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_SEGMENT, 1 - 1), Result, yCenter)))))))));
	}
	delay(500);
}

**运行结果:**当程序上传成功后,HUSKYLENS 2会自动切换到实例分割功能下,将HUSKYLENS 2对准待识别的物体(必须是80类之中),观察终端出现识别到的实例数量、指定实例的ID、中心点坐标等数据。

Interface Diagram

9.2获取指定实例的相关数据

在实例分割功能下,HUSKYLENS 2 学习后,可获取画面中指定实例的相关数据。例如,判断某个已学习的实例是否在画面中、指定手实例的名称、同类实例的数量,当画面中出现多个相同类别是实例时,可指定获取其中某个实例的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_SEGMENT);
}
void loop() {
	huskylens.getResult(ALGORITHM_SEGMENT);
	if ((huskylens.available(ALGORITHM_SEGMENT))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_SEGMENT, 1) != NULL))) {
			Serial.println((String("画面中ID1的实例总数") + String((huskylens.getCachedResultNumByID(ALGORITHM_SEGMENT, 1)))));
			Serial.println((String("ID1的实例名称") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_SEGMENT, 1), Result, name)))));
			Serial.println((String("识别到第1个ID为1的实例的坐标") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_SEGMENT, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_SEGMENT, 1, 1-1), Result, xCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**当程序上传成功后,HUSKYLENS 2会自动切换到实例分割功能下,当同一类别的多个实例出现在画面中时可以识别同一类别的实例的数量,输出指定实例的ID、中心点坐标、ID等相关数据。

Interface Diagram

10.手势识别代码示例

10.1识别手势输出相关数据

在手势识别的功能下HUSKYLENS 2 可以检测出手掌、绘制手掌关键点、学习手势并识别已学习的手势。可以通过程序将相关数据通过串口打印输出。可以读取的数据有:靠近HUSKYLENS 2 摄像头画面中心的手势ID号、画面中检测到的手势总数、检测到的第一个手势ID号。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_HAND_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_HAND_RECOGNITION);
	if ((huskylens.available(ALGORITHM_HAND_RECOGNITION))) {
		Serial.println((String("靠近中心的手势ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), Result, ID)))));
		Serial.println((String("检测到是手势总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_HAND_RECOGNITION)))));
		Serial.println((String("第1个检测到的手势ID为:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_HAND_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}

程序上传完成后HUSKYLENS 2 进入手势识别功能。将HUSKYLENS 2 的摄像头对准画面中的手势进行学习,如何学习手势详细操作请看:手势识别功能说明

打开串口监视器,观察输出结果。

**运行结果:**可输出检测到的手势总数,不管是否为学习过的手势,只要检测到手势都会计数(方框框出即检测为手势)。可按要求输出相应手势的ID号,学习过的手势会按照学习顺序分配ID号,未学习过的手势,其ID号为0。

Interface Diagram

10.2获取指定手势的相关数据

HUSKYLENS 2 识别手势后,可获取画面中指定手势的相关数据。例如,判断某个已学习的手势是否在画面中、指定手势的名称、可获取画面中相同手势的数量,当画面中出现多个相同手势时,可指定获取其中某个手势的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下:

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_HAND_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_HAND_RECOGNITION);
	if (((huskylens.getCachedResultByID(ALGORITHM_HAND_RECOGNITION, 1) != NULL))) {
		Serial.println((String("画面中的ID1手势总数") + String((huskylens.getCachedResultNumByID(ALGORITHM_HAND_RECOGNITION, 1)))));
		Serial.println((String("ID1手势名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_HAND_RECOGNITION, 1), Result, name)))));
		Serial.println((String("检测到的第1个ID1的手势坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_HAND_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_HAND_RECOGNITION, 1, 1-1), Result, yCenter)))))))));
	}
	delay(500);
}

**运行结果:**如图所示,可获取到画面中ID1手势数量、名称,以及检测到的第一个ID1手势的坐标位置。

Interface Diagram

11. 车牌识别代码示例

11.1识别车牌输出相关数据

在车牌识别功能下,当车牌出现在HUSKYLENS 2 屏幕中时,可以被识别和框出,可以获取HUSKYLENS 2 画面中车票的总数、离十字光标最近的车牌的相关数据并在串口打印出来,可以读取车牌的数据有:车牌ID、车牌名称、车牌内容(车牌号)、宽度、高度以及车牌中心点的X坐标位置和Y坐标位置。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_LICENSE_RECOGNITION))) {
		Serial.println((String("画面中的车牌总数") + String((huskylens.getCachedResultNum(ALGORITHM_LICENSE_RECOGNITION)))));
		Serial.println((String("靠近中心的车牌ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, ID)))));
		Serial.println((String("靠近中心的车牌号为:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, content)))));
		Serial.println((String("靠近中心的车牌中心点坐标为:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, yCenter)))))))));
	}
	delay(500);
}

**运行结果:**如下,对于未学习过的车牌默认输出ID为0。,如何学习车牌详细操作请看:车牌识别功能说明

Interface Diagram

11.2识别车牌输出相关数据

当画面中出现多张车牌时,可以使用以下示例程序统计指定ID的车牌数量,获取指定ID车牌的相关数据。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_LICENSE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_LICENSE_RECOGNITION, 1) != NULL))) {
			Serial.println((String("ID为1的车牌总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_LICENSE_RECOGNITION, 1)))));
			Serial.println((String("ID为1的车牌的内容为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_LICENSE_RECOGNITION, 1), Result, content)))));
			Serial.println((String("第1个ID为1车牌的中心点坐标为:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_LICENSE_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_LICENSE_RECOGNITION, 1, 1-1), Result, yCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**如下,当画面中出现多个相同车牌时,HUSKYLENS 2 可以识别画面中所有ID为1的车牌(前提时已学习某一车牌并分配ID为1,未学习过的车牌统一ID为0),通过串口能观察统计的当前画面的ID1车牌总数。同时串口输出第一张ID为1的车牌的相关数据。

Interface Diagram

12.光学字符识别代码示例

12.1识别文字输出中心附近文字的相关数据

在光学字符识别功能下,HUSKYLENS 2 可识别并框出视野内文字块出现的区域,并将识别到的文字显示在左上角,可使用以下示例程序,统计画面中可识别文字区域的总数、获取画面中离十字光标最近的文字块,并将相关数据通过串口打印输出,可以读取的数据有:文字块的ID 、名称、内容、中心点X坐标和Y坐标、文字块宽度和高度。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_OCR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OCR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OCR_RECOGNITION))) {
		Serial.println((String("画面中的文字块总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_OCR_RECOGNITION)))));
		Serial.println((String("靠近中心的文字内容为:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, content)))));
		Serial.println((String("检测到的第1个文字块的ID为") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, ID)))));
		Serial.println((String("检测到的第1个文字块的宽度为") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, width)))));
		Serial.println((String("检测到的第1个文字块的高度为") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, width)))));
	}
	delay(500);
}

**运行结果:**如下,对于已学习过的文字块输出ID与HUSKYLENS 2 屏幕显示的ID保持一致。

Interface Diagram

注:在光学字符识别功能下,HUSKYLENS 2能检测出画面中所有文字块出现的区域并用方框圈出,但是只识别离十字光标最近的一个文字块区域的内容并显示在方框左上角。

13.姿态识别代码示例

13.1识别人体输出相关数据

可识别HUSKYLENS 2 视野内的人体,并将相关数据通过串口打印输出,可以读取的数据有:靠近HUSKYLENS 2 摄像头画面中心的人体姿态ID、名称、宽度、高度以及中心点的X坐标和Y坐标、检测到的人体总数、检测到的第一个姿态的相关数据等。

示例程序如下。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_POSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_POSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_POSE_RECOGNITION))) {
		Serial.println((String("检测到的人体总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_POSE_RECOGNITION)))));
		Serial.println((String("靠近中心的人体ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), Result, ID)))));
		Serial.println((String("靠近中心的人体名称:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), Result, name)))));
		Serial.println((String("检测到的第1个人体的ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_POSE_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}

通程序上传成功后,HUSKYLENS 2 进入姿态识别功能。将HUSKYLENS 2 的摄像头对准画面中的人体姿态进行学习,如何学习姿态详细操作请看:姿态识别功能说明

学习完成后打开串口监视器,观察输出结果。

**运行结果:**可输出检测到的人体总数;可按要求输出相应人体姿态ID号,已学习的人体姿态会按学习顺序分配ID号,未学习的姿态,ID号为0。

Interface Diagram

13.2获取画面中指定姿态的相关数据

HUSKYLENS 2 识别人体姿态后,可获取画面中指定姿态的相关数据。例如,判断某个已学习的姿态是否在画面中、指定姿态的名称、可获取画面中相同姿态的数量,当画面中出现多个相同姿态时,可指定获取其中某个姿态的相关参数,包括名称、X/Y坐标、宽度、高度。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_POSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_POSE_RECOGNITION);
	if (((huskylens.getCachedResultByID(ALGORITHM_POSE_RECOGNITION, 1) != NULL))) {
		Serial.println((String("画面中ID1的人体姿态总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_POSE_RECOGNITION, 1)))));
		Serial.println((String("ID1人体姿态名称为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_POSE_RECOGNITION, 1), Result, name)))));
		Serial.println((String("检测到的第1个ID1的姿态的坐标为:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_POSE_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_POSE_RECOGNITION, 1, 1-1), Result, yCenter)))))))));
	}
	delay(500);
}

**运行结果:**如图所示,可获取到画面中的姿态总数、画面中ID1姿态数量、名称,以及检测到的第一个ID1姿态的坐标位置

Interface Diagram

14.巡线代码示例

14.1识别路口输出数据

在巡线功能下,HUSKYLENS 2可以标记出画面中路线的轨迹,获取当前路线的长度、角度和X、Y分量。当路线出现分支时,可以获取路口的分支数量和逆时针方向起每条分支的相应数据。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_LINE_TRACKING);
}
void loop() {
	huskylens.getResult(ALGORITHM_LINE_TRACKING);
	if ((huskylens.available(ALGORITHM_LINE_TRACKING))) {
		Serial.println((String((String("当前路线的X分量:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, xTarget))))) + String((String(";Y分量:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, yTarget)))))));
		Serial.println((String((String("当前路线的角度:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, angle))))) + String((String(";长度:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, length)))))));
		Serial.println((String("前方路口分支数量:") + String((huskylens.getUpcomingBranchCount(ALGORITHM_LINE_TRACKING)))));
		Serial.println((String((String("逆时针方向第1条分支的X分量") + String((RET_ITEM_NUM(huskylens.getBranch(ALGORITHM_LINE_TRACKING, 1-1), Result, xTarget))))) + String((String(";Y分量") + String((RET_ITEM_NUM(huskylens.getBranch(ALGORITHM_LINE_TRACKING, 1-1), Result, yTarget)))))));
	}
	delay(500);
}

**运行结果:**如图所示,将HUSKYLENS的镜头对准带有路线的地图,观察串口监视器可以输出当前路线的长度、角度等数据。当路线由多个分支时,可以输出分支数量。

Interface Diagram

15.表情识别示例代码

15.1识别画面中的所有表情

在表情识别功能下,HUSKYLENS 2 能识别7种特定的表情:愤怒(ID为1)、厌恶(ID为2)、恐惧(ID为3)、开心(ID为4)、中性(ID为5)、悲伤(ID为6)和惊讶(ID为7)。以上表情已经在HUSKYLENS 2 出厂时学习完毕,无需用户再次手动学习,表情识别的详细功能使用说明请见表情识别功能说明

通过以下示例程序能统计当前HUSKYLENS 2 摄像头画面出识别出的所有表情的数量,并依次输出各个表情的相关数据。

示例程序如下

#include "DFRobot_HuskylensV2.h"

// 动态变量
volatile float mind_n_BiaoQingZongShu, mind_n_BiaoShiBianLiang;
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	mind_n_BiaoQingZongShu = 0;
	mind_n_BiaoShiBianLiang = 0;
}
void loop() {
	huskylens.getResult(ALGORITHM_EMOTION_RECOGNITION);
	if ((huskylens.available(ALGORITHM_EMOTION_RECOGNITION))) {
		mind_n_BiaoQingZongShu = (huskylens.getCachedResultNum(ALGORITHM_EMOTION_RECOGNITION));
		Serial.println((String("画面中的表情总数为:") + String(mind_n_BiaoQingZongShu)));
		while (!(mind_n_BiaoShiBianLiang>=mind_n_BiaoQingZongShu)) {
			mind_n_BiaoShiBianLiang += 1;
			Serial.println((String((String("第") + String((String(mind_n_BiaoShiBianLiang) + String("个表情为:"))))) + String((RET_ITEM_STR(huskylens.getCachedResultByIndex(ALGORITHM_EMOTION_RECOGNITION, mind_n_BiaoShiBianLiang-1), Result, name)))));
		}
		mind_n_BiaoShiBianLiang = 0;
	}
	delay(500);
}

当任意以上七种表情出现在摄像头画面中,观察HUSKYLENS 2 的屏幕会将表情框出,显示表情名称和置信度。

**运行结果:**观察串口输出当前识别到的表情总数和对应名称。

Interface Diagram

15.2统计每类表情数量

在已知表情识别功能下输出的ID只有数字1——7(对应7种表情)的情况下,我们可以使用以下示例程序统计当前HUSKYLENS 2 摄像头画面出识别出的每一类表情的数量。


#include "DFRobot_HuskylensV2.h"

// 动态变量
volatile float mind_n_BiaoShiBianLiang;
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_EMOTION_RECOGNITION);
	mind_n_BiaoShiBianLiang = 1;
}
void loop() {
	huskylens.getResult(ALGORITHM_EMOTION_RECOGNITION);
	if ((huskylens.available(ALGORITHM_EMOTION_RECOGNITION))) {
		if ((mind_n_BiaoShiBianLiang<=7)) {
			if (((huskylens.getCachedResultByID(ALGORITHM_EMOTION_RECOGNITION, mind_n_BiaoShiBianLiang) != NULL))) {
				Serial.println((String((String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_EMOTION_RECOGNITION, mind_n_BiaoShiBianLiang), Result, name))) + String("的总数为:"))) + String((huskylens.getCachedResultNumByID(ALGORITHM_EMOTION_RECOGNITION, mind_n_BiaoShiBianLiang)))));
			}
			mind_n_BiaoShiBianLiang += 1;
		}
		else {
			mind_n_BiaoShiBianLiang = 1;
		}
	}
	delay(500);
}

**运行结果:**如下,运行程序,当画面中出现多张不同表情的人脸图像时,观察串口输出当前识别到的每一类表情总数的名称和对应数量。

Interface Diagram

16.标签识别代码示例

16.1识别标签输出相关数据

在标签识别功能下,HUSKYLENS 2 能识别出现在画面中的AprilTag标签,可以通过编程统计标签总数、获取画面中离十字光标最近的标签的相关数据并在串口打印出来,可以读取标签数据有:标签ID、标签内容、标签宽度、标签高度以及标签中心点的X坐标和Y坐标位。当画面中有多个标签时可以获取指定标签的数据。
如何使用标签识别功能,详细操作请看:标签识别功能说明

示例程序下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_TAG_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_TAG_RECOGNITION);
	if ((huskylens.available(ALGORITHM_TAG_RECOGNITION))) {
		Serial.println((String("标签总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_TAG_RECOGNITION)))));
		Serial.println((String("靠近中心的标签ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_TAG_RECOGNITION), Result, ID)))));
		Serial.println((String("靠近中心的标签中心点坐标为:") + String((String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_TAG_RECOGNITION), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_TAG_RECOGNITION), Result, yCenter)))))));
		Serial.println((String("检测到的第一个标签的ID为") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_TAG_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}

当识别出标签后,观察HUSKYLENS 2 的屏幕会将标签框出,并在方框的左上角显示解析出的标签内容。打开串口监视器,观察输出的数据。

**运行结果:**如下,对于未学习过的标签默认输出ID为0,串口输出的标签内容与HUSKYLENS 2 的屏幕显示的保持一致。

Interface Diagram

如下,对学习过的标签串口输出的标签ID,标签内容与HukyLens 2的屏幕显示的保持一致。

Interface Diagram

16.2输出指定标签的相关数据

当画面中出现多张同一ID的标签(已学习的标签ID按学习顺序分配,未学习的标签ID统一为0)时,可以使用以下示例程序统计画面中的同一ID标签的数量,获取指定一张ID标签的相关数据。

示例程序下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_TAG_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_TAG_RECOGNITION);
	if ((huskylens.available(ALGORITHM_TAG_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_TAG_RECOGNITION, 1) != NULL))) {
			Serial.println((String("ID1标签的总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_TAG_RECOGNITION, 1)))));
			Serial.println((String("ID1标签的内容为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_TAG_RECOGNITION, 1), Result, content)))));
			Serial.println((String("第一个ID1标签的中心点坐标为") + String((String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_TAG_RECOGNITION, 1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_TAG_RECOGNITION, 1), Result, yCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**如下,当画面中出现多个相同标签时,HUSKYLENS 2 可以识别画面中所有ID为1的标签(前提时已学习某一标签并分配ID为1,未学习过的标签统一ID为0),通过串口能观察统计的当前画面的ID1标签总数。同时串口输出第一张ID为1的标签的相关数据。

Interface Diagram

17. 二维码识别代码示例

17.1识别二维码输出相关数据

在二维码识别功能下,HUSKYLENS 2 能识别出现在画面中的二维码,可以通过编程统计二维码的总数、获取画面中离十字光标最近的二维码的相关数据并在串口打印出来,可以读取数据有:二维码ID、二维码名称、二维码解码内容、二维码宽度、二维码高度以及二维码中心点的X坐标位置和Y坐标位置。**

以下是示例程序

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_QRCODE_RECOGNITION))) {
		Serial.println((String("二维码总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_QRCODE_RECOGNITION)))));
		Serial.println((String("靠近中心的二维码ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_QRCODE_RECOGNITION), Result, ID)))));
		Serial.println((String("靠近中心的二维码中心点坐标为:") + String((String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_QRCODE_RECOGNITION), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_QRCODE_RECOGNITION), Result, yCenter)))))));
		Serial.println((String("检测到的第一个二维码的ID为") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_QRCODE_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}

当识别出二维码后,观察HukyLens 2的屏幕会将二维码框出,并在方框的左上角显示解析出的二维码内容,打开串口监视器,观察输出数据。

**运行结果:**如下,对于未学习过的二维码默认输出ID为0,串口输出的二维码内容与HukyLens 2的屏幕显示的保持一致,对学习过的二维码串口输出的标签ID,标签内容与HUSKYLENS 2 的屏幕显示的保持一致。

Interface Diagram

##17.2 输出指定二维码的相关数据
当画面中出现多张同一ID的二维码(已学习的标签ID按学习顺序分配,未学习的二维码ID统一为0)时,可以使用以下示例程序统计画面中的同一ID二维码的数量,获取指定一张ID二维码的相关数据。

如何使用二维码识别功能,详细操作请看:二维码识别使用说明

示例程序下

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_QRCODE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_QRCODE_RECOGNITION, 1) != NULL))) {
			Serial.println((String("ID1二维码的总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_QRCODE_RECOGNITION, 1)))));
			Serial.println((String("ID1二维码的内容为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_QRCODE_RECOGNITION, 1), Result, content)))));
			Serial.println((String("第一个ID1二维码的中心点坐标为") + String((String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_QRCODE_RECOGNITION, 1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedResultByID(ALGORITHM_QRCODE_RECOGNITION, 1), Result, yCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**如下,当画面中出现多个二维码时,HUSKYLENS 2 可以识别到所有二维码(未学习和已学习的),通过串口能观察统计的当前画面的二维码总数。同时串口输出打印指定的ID为1的二维码的相关数据。

Interface Diagram

18.条形码识别代码示例

18.1识别条形码输出相关数据

在条形码识别功能下,HUSKYLENS 2 能识别出现在画面中的条形码,可以通过编程统计条形码总数、获取画面中离十字光标最近的标签的相关数据并在串口打印出来,可以读取标签数据有:条形码ID、条形码内容、条形码宽度、条形码高度以及条形码中心点的X坐标位置和Y坐标位置。

以下是示例程序。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_BARCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_BARCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_BARCODE_RECOGNITION))) {
		Serial.println((String("条形码总数为:") + String((huskylens.getCachedResultNum(ALGORITHM_BARCODE_RECOGNITION)))));
		Serial.println((String("靠近中心的条形码ID为:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_BARCODE_RECOGNITION), Result, ID)))));
		Serial.println((String("靠近中心的条形码中心点坐标为:") + String((String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_BARCODE_RECOGNITION), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_BARCODE_RECOGNITION), Result, yCenter)))))));
		Serial.println((String("检测到的第一个条形码的ID为") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_BARCODE_RECOGNITION, 1-1), Result, ID)))));
	}
	delay(500);
}


当识别出条形码后,观察HUSKYLENS 2 的屏幕会将标签框出,并在方框的左上角显示解析出条形码内容,打开Mind+的串口,观察串口输出离十字光标最近的一个条形码的相关数据。

**运行结果:**如下,对于未学习过的条形码默认输出ID为0,串口输出的条形码内容与HUSKYLENS 2 的屏幕显示的保持一致。

Interface Diagram

18.2识别条形码输出相关数据

当画面中出现多张同一ID的条形码(已学习的标签ID按学习顺序分配,未学习的ID统一为0)时,可以使用以下示例程序统计画面中的同一ID条形码的数量,获取指定一张ID条形码的相关数据。

以下是示例程序。

#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;


// 主程序开始
void setup() {
	Serial.begin(9600);
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_BARCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_BARCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_BARCODE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_BARCODE_RECOGNITION, 1) != NULL))) {
			Serial.println((String("ID1条形码的总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_BARCODE_RECOGNITION, 1)))));
			Serial.println((String("ID1条形码的内容为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_BARCODE_RECOGNITION, 1), Result, content)))));
			Serial.println((String("第一个ID1条形码的中心点坐标为") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_BARCODE_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_BARCODE_RECOGNITION, 1, 1-1), Result, yCenter)))))))));
		}
	}
	delay(500);
}

**运行结果:**如下,当画面中出现多个条形码时,HUSKYLENS 2 可以识别到所有条形码(未学习和已学习的),通过串口能观察统计的当前画面的条形码总数。同时串口输出打印指定的ID为1的条形码的相关数据。

Interface Diagram